package Servidor;

//Servidor que recibe y envía paquetes de/a un cliente.
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.border.MatteBorder;

import Barrera.barrier;
import Barrera.prubarrier;
import Hilo.hilo;
import Socket.SocketBytes;
import javax.swing.border.SoftBevelBorder;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;

public class Servidor extends JPanel {

	private static final long serialVersionUID = 1L;
	private ServerSocket socket;
	private int puerto;
	private int maxcon; 
	private int numcon; 
	private barrier B;
	
	
	// api
	private JPanel panelJugador1;
	private JPanel panelJugador2;
	private JTextArea areaPantalla;
	public JButton btnIniciarJuego;
	
 
	public Servidor() {		
		setBounds(0, 0, 633, 433);
		setLayout(null);
		
		JPanel panelBarra = new JPanel();
		panelBarra.setBounds(0, 344, 633, 89);
		add(panelBarra);
		panelBarra.setBorder(new MatteBorder(3, 2, 2, 2, (Color) new Color(0, 0, 0)));
		panelBarra.setBackground(Color.GRAY);
		panelBarra.setLayout(null);
		
		JLabel lblJugadores = new JLabel("Jugadores");
		lblJugadores.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblJugadores.setBounds(532, 21, 61, 16);
		panelBarra.add(lblJugadores);
		
		panelJugador1 = new JPanel();
		panelJugador1.setBorder(new LineBorder(new Color(0, 0, 0)));
		panelJugador1.setBackground(Color.RED);
		panelJugador1.setBounds(542, 45, 10, 10);
		panelBarra.add(panelJugador1);
		
		panelJugador2 = new JPanel();
		panelJugador2.setBackground(Color.RED);
		panelJugador2.setBorder(new LineBorder(new Color(0, 0, 0)));
		panelJugador2.setBounds(563, 45, 10, 10);
		panelBarra.add(panelJugador2);
		
		JLabel lblMaxJug = new JLabel("M\u00E1ximos jugadores: 2");
		lblMaxJug.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblMaxJug.setBounds(253, 21, 115, 16);
		panelBarra.add(lblMaxJug);
		
		JLabel lblPuertoEs = new JLabel("Puerto de escucha: 9999");
		lblPuertoEs.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblPuertoEs.setBounds(253, 56, 140, 16);
		panelBarra.add(lblPuertoEs);
		
		btnIniciarJuego = new JButton("Iniciar juego");
		btnIniciarJuego.setFont(new Font("Marker Felt", Font.PLAIN, 15));
		btnIniciarJuego.setBounds(38, 21, 117, 49);
		panelBarra.add(btnIniciarJuego);
		
		JPanel panel4 = new JPanel();
		panel4.setBounds(0, 0, 633, 343);
		add(panel4);
		panel4.setLayout(null);
		
		JLabel lblModo = new JLabel("Modo servidor");
		lblModo.setFont(new Font("Marker Felt", Font.PLAIN, 19));
		lblModo.setBounds(32, 25, 233, 44);
		panel4.add(lblModo);
		
		JSeparator separator4 = new JSeparator();
		separator4.setBounds(19, 59, 597, 12);
		panel4.add(separator4);
		
		areaPantalla = new JTextArea();
		areaPantalla.setFont(new Font("Marker Felt", Font.PLAIN, 15));
		
		JScrollPane scrollPane = new JScrollPane(areaPantalla);
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
		scrollPane.setViewportBorder(UIManager.getBorder("FormattedTextField.border"));
		scrollPane.setBounds(32, 93, 569, 223);
		panel4.add(scrollPane);
		
		JLabel lblEtsiiBuzz = new JLabel("Etsii BUZZ");
		lblEtsiiBuzz.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblEtsiiBuzz.setBounds(520, 25, 81, 16);
		panel4.add(lblEtsiiBuzz);
	} // fin del constructor de Servidor 
 
	
	public void IniciarServidor(int puerto_in, int maxcon_in) throws IOException {
		puerto = 9999;
		maxcon = 2;
		numcon = 0;
	   
		B = new barrier(maxcon);

	    // crear objeto DatagramSocket para enviar y recibir paquetes
	    try {
	    	socket = new ServerSocket(puerto);
	    }

	    // procesar los problemas que pueden ocurrir al crear el objeto DatagramSocket
	    catch( SocketException excepcionSocket ) {
	    	excepcionSocket.printStackTrace();
	    	System.exit( 1 );
	    }
	 } // fin del constructor de Servidor
	
	
 
	public synchronized void subnumcon() {
		escribirMensaje("Jugador ha abandonado a la partida.\n");
		numcon--;
	} // subnumcon

	private synchronized void addnumcon() throws Exception {
	 //escribirMensaje("Jugador se ha unido a la partida.\n");
		numcon++;
	} // addnumcon
 
 
 	// esperar a que lleguen los paquetes, mostrar los datos y repetir el paquete al cliente
 	public void esperarPaquetes() throws Exception {
 		while (true) { 			
 			while (numcon == maxcon) {
 				synchronized(this) {
 					try {
 					} catch (Exception e) {// Imprimir cualquier excepcion
 					}
 				}
 			} // while segundo

 			SocketBytes SocketDatos = new SocketBytes(socket.accept());
 			addnumcon();        
 			// Arrancar hilo que atiende esta conexion por el Socket SocketDatos y recibe este objeto para actualizar
 			// el n�mero de conexiones libres.
 			hilo h = new hilo(SocketDatos, this);
 			
 			if(numcon==maxcon){
 				escribirMensaje("\nComienza la partida\n");
 				System.out.println("\nComienza la partida\n");
 			}
 			
 			
 		} // while primero
 } // fin del método esperarPaquetes
 
 	public void escribirMensaje(String msg){
 		areaPantalla.setText(areaPantalla.getText() + msg);	 
 	}
 	
 	 private void mostrarMensaje( final String mensajeAMostrar ) {
 	    // mostrar el mensaje del subproceso de ejecución despachador de eventos
 	    SwingUtilities.invokeLater(
 	      new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

 	          public void run() // actualiza areaPantalla
 	          {
 	             areaPantalla.append( mensajeAMostrar );
 	             areaPantalla.setCaretPosition( 
 	                areaPantalla.getText().length() );
 	          }

 	       }  // fin de la clase interna

 	    ); // fin de la llamada a SwingUtilities.invokeLater
 	 }

} // fin de la clase Servidor